/*
 * send.c
 *
 *  Created on: 5 nov. 2013
 *      Author: julien
 */
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netinet/in.h>

#include "../include/echo_server.h"
#include "../include/send.h"

/*void sendFile(char* buffer){
 int ip;
 int port;
 struct sockaddr_in clientaddr;

 // On récupère l'adresse et le port du client à qui envoyer
 clientaddr = sendRequest();

 // On créer la connexion vers le client

 // On envoie le fichier
 }*/

void sendRequest(char* message, int socket, listeClients liste) {
	int socket_envoie;
	int port;

	// On récupère le pseudo
	char* pseudo = strstr(message, " ") + 1; // On recherche le premier espace avant le pseudo auquel envoyer

	fprintf(stdout, "Pseudo cherché : %s\n", pseudo);

	// On récupère le socket correspondant
	client* temp = liste;
	while (temp != NULL) {
		if (!strcmp(temp->pseudo, pseudo)) {
			socket_envoie = temp->socket;
		}
		temp = temp->next;
	}
	fprintf(stdout, "Pseudo trouvé\n");
	// On envoie la requete
	sendline(socket_envoie, ".request\n", strlen(".request\n"));

	// On récupère les informations
	fprintf(stdout, "Requete au client2 envoyée\n");
	read(socket_envoie, &port, sizeof(int));

	fprintf(stdout, "Port reçu : %d\n", port);

	// On l'envoie au client demandeur

	//sendline(socket, &clientaddr, sizeof(clientaddr));
}

void getNames(listeClients liste, int socket) {
	client* temp = liste;

	while (temp != NULL) {
		sendline(socket, temp->pseudo, strlen(temp->pseudo));
		temp = temp->next;
	}

}

int sendToName(listeClients liste, char* message) {

	char* vraiMessage = strstr(message, " ") + 1; // On recherche le premier espace après le pseudo auquel envoyer
	char Pseudo[20];
	int i = 0;
	while (*(message + i) != ' ') {
		Pseudo[i] = *(message + (i + 1));
		i++;
	}
	Pseudo[i - 1] = '\n';

// On recherche le socket sur lequel envoyer
	client* temp = liste;
	while (temp != NULL) {
		if (!strcmp(temp->pseudo, Pseudo)) {
			sendline(temp->socket, vraiMessage, strlen(vraiMessage));
			return 1;
		}
		temp = temp->next;
	}
	return 0;
}

int readline(int fd, void *str, int max_len) {
	int n, rc;
	char c;
	char* buffer;

	buffer = str;
	for (n = 1; n < max_len; n++) {
		if ((rc = read(fd, &c, 1)) == 1) {
			*buffer++ = c;
			if (c == '\n')
				break;
		} else {
			if (rc == 0) {
				if (n == 1)
					return 0;
				else
					break;
			}
			if (rc == -1) {
				if (errno == EINTR)
					continue;
				else
					return -1;
			}
		}
	}
	*buffer = '\0';
	return n;
}

int sendline(int fd, const void *str, size_t maxlen) {
	int nleft; //caractères restant à écrire
	int nwritten; // caractères déjà écrits

	const char* buffer;

	buffer = str;
	nleft = maxlen;
	while (nleft > 0) {
		if ((nwritten = write(fd, buffer, nleft)) < 0) {
			if (errno == EINTR)
				nwritten = 0;
			else
				return -1;
		}
		nleft -= nwritten;
		buffer += nwritten;
	}
	return maxlen;
}
